package com.xyx.jdbc2;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class SimplePlant {
	/**
	 * 简单工厂模式：获取一个指定Class的实例对象
	 * 
	 * @param clazz
	 * @return
	 */
	public static <T> T getInstance(Class<T> clazz) {
		T t = null;
		try {
			t = clazz.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return t;
	}
	
	public static<T> List<T> changeType(ResultSet rs,Class<T> clazz) {
		List<T> list = new ArrayList<>();
		if (rs != null) {
			try {
				// 因为已经遍历过一次结果，所有再次遍历之前，需要将光标移动到最前位置（第一行之前）
				rs.beforeFirst();
				// 获取结果集中的所有的列的信息
				ResultSetMetaData rsmd = rs.getMetaData();
				// 获取结果集中列的个数
				int colCount = rsmd.getColumnCount();
				while (rs.next()) {
					T tClass = SimplePlant.getInstance(clazz);
					for (int i = 1; i <= colCount; i++) {
						// 通过下标获取每行的每个字段名
						String strKey = rsmd.getColumnName(i);
						/*
						 * 注意：需要遵循约定规则：实体类的属性名和数据库的字段名名字要一样，且属性名要全部小写
						 */
						//反射通过获取的字段名，得到反射后实例类的的属性对象
						Field field=clazz.getDeclaredField(strKey.toLowerCase());
						//通过反射设置属性的访问权限
						field.setAccessible(true);
						//调用field的set方法进行属性赋值
						field.set(tClass,changeTypeName(rs.getObject(strKey), field.getType().getName()));

					}
					// 将存有当前行的对象存入到list集合当中
					list.add(tClass);
				}
			} catch (SQLException e) {
				// 将查询结果集转换为List对象异常：
				System.out.println("将查询结果集转换为List对象异常：" + e.getMessage());
				e.printStackTrace();
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return list;
	}
	/**
	 * 把数据映射为的JDBC数据类型转换常用java基本数据类型
	 * 
	 * @param obj
	 *            数据映射为的JDBC数据类型
	 * @param strDesDataType
	 *            常用java基本数据类型
	 * @return 转换之后的数据类型
	 */
	public static Object changeTypeName(Object obj,String strName) {
		Object obj_new=null;
		if(obj!=null) {
			switch(strName.trim()) {
			case "java.lang.Long":
				obj_new=Long.parseLong(obj.toString());
				break;
			case "java.lang.Double":
				obj_new=Double.parseDouble(obj.toString());
				break;
				default:
					obj_new=obj;
					break;
			}
		}
		
		
		return obj_new;
		
	}

}
